iT邦幫忙

2024 iThome 鐵人賽

DAY 6
1
Software Development

我命由我不由語言 java爬蟲挑戰系列 第 6

java爬蟲挑戰 Day 6 - Java導入SSL証書

  • 分享至 

  • xImage
  •  

上一篇我們的錯誤

javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

我們的Java應用程式在與591伺服器進行 HTTPS 通訊時,出現錯誤。

unable to find valid certification path to requested target

意思就是Java的信任庫中沒有591的憑證的意思。

那要解決這問題只要把591的憑證導入Java的信任庫就好。

實際導入SSL憑證

我這邊就不說明HTTPS憑證、公私鑰、CA、crt、keytool是甚麼了。
有興趣可能自己去問GPT了。

不過只要跟著我做,即使不知道在幹嘛,還是可以解決問題的。

首先我們先去591,取得591的crt檔案。

https://ithelp.ithome.com.tw/upload/images/20240823/20168635c0fWgItfMg.png

https://ithelp.ithome.com.tw/upload/images/20240823/20168635ESR0IWMfiT.png

儲存
https://ithelp.ithome.com.tw/upload/images/20240823/20168635ph7ziE8va8.png

接下來 使用系統管理員打開CMD執行指令,使用java的keytool將591的crt加入Java的信任庫中。

"C:\Program Files\Java\jdk-17\bin\keytool" -import -alias 591cert -keystore "C:\Program Files\Java\jdk-17\lib\security\cacerts" -file "C:\Users\a3636\Documents\鐵人賽\Day06\_.591.com.tw.crt" -storepass changeit

各參數說明

  • "C:\Program Files\Java\jdk-17\bin\keytool" : 我本機java jdk路徑後面加上\bin\keytool
  • -import : 動作為 匯入
  • -alias 591cert : 替這張crt命名,可隨意調整
  • -keystore: 動作為 指定信任庫位置
  • "C:\Program Files\Java\jdk-17\lib\security\cacerts" : 我本機java jdk路徑後面加上\lib\security\cacerts
  • -file : 動作為 指定我剛剛存放的591crt路徑
  • "C:\Users\a3636\Documents\鐵人賽\Day06_.591.com.tw.crt" :我存放的路徑
  • -storepass changeit: 指定keystore 密碼,使用預設密碼changeit

https://ithelp.ithome.com.tw/upload/images/20240823/20168635C9ZL2VGMNw.png

https://ithelp.ithome.com.tw/upload/images/20240823/20168635fu3zPaRb7D.png

如果沒用系統管理員:
https://ithelp.ithome.com.tw/upload/images/20240823/20168635te9wD90K8K.png

為什麼需要導入 SSL 憑證?

  • 驗證伺服器身分:當 Java 應用程式透過 HTTPS 存取伺服器時,伺服器會傳送一個 SSL 憑證給客戶端(即你的 Java 應用程式)。 Java 會透過本地的信任庫(cacerts 檔案)來檢查這個憑證是否可信。如果該憑證不在信任庫中,Java 會拒絕建立連接,並拋出 SSL 相關的例外。

  • 提高安全性:將憑證匯入到信任庫可以確保只有被信任的伺服器才能與 Java 應用程式通訊。這樣可以有效防止中間人攻擊,因為只有持有可信任憑證的伺服器才會被接受。

  • 自簽名憑證和內部服務:有時候,你的應用程式可能需要與使用自簽名憑證或內部憑證的伺服器通訊。這些憑證通常不會被公開的憑證授權單位(CA)簽署,因此預設不會被 Java 信任。為了讓 Java 能夠與這些伺服器建立連接,你需要手動將這些憑證匯入到 Java 的信任庫中。

Python的requests

沒有比較沒有傷害,Java現在真的是學習難度比較高的語言。

Python 的請求庫(如 requests)在處理 HTTPS 連接時,預設會使用系統的根憑證存儲,這意味著它可以自動信任系統中的憑證。
Python 還允許透過簡單的參數配置(如 verify=False)來繞過 SSL 驗證。

雖然也有些缺點,但是可以讓新手簡單開始寫程式。
不需要優先搞懂SSL、HTTPS、公私鑰等的相關知識。

重新執行Jsoup.connect

https://ithelp.ithome.com.tw/upload/images/20240823/20168635pwU9QTUYiR.png

可以看到已經沒有錯誤訊息了,並且我把Html的資訊印出來了。

其實只要透過Jsoup就可以快速地拿到Html的內容。
核心程式碼就三行

  1. 指定網址url
  2. get
  3. 印出
String urlString = "https://rent.591.com.tw/list?other=newPost&sort=posttime_desc";
Document doc = Jsoup.connect(urlString).get();
log.info("doc is : {}", doc);

小結

其實今天只解決了SSL的問題,還沒有處理動態網頁的問題,明天繼續。


上一篇
Java爬蟲挑戰 Day 5 - Spring boot專案建立 & Jsoup爬取HTML資料
下一篇
java爬蟲挑戰 Day 7 - 使用selenium處理動態網頁
系列文
我命由我不由語言 java爬蟲挑戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
YR
iT邦新手 4 級 ‧ 2024-08-23 19:53:37

連帶把我以前不懂APP裡面,為什麼要包cert的疑惑解了

小草 iT邦新手 5 級 ‧ 2024-08-23 22:35:14 檢舉

我也漲知識了,原來APP也要注意這些!

我要留言

立即登入留言